#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/select.h"
#include "sys/time.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include "poll.h"


/*
 * @description		: main主程序
 * @param - argc 	: argv数组元素个数
 * @param - argv 	: 具体参数
 * @return 			: 0 成功;其他 失败
 */
int main(int argc, char *argv[])
{
	int fd, ret;
	char *filename;
	struct pollfd fds;
	fd_set readfds;
	struct timeval timeout;
	unsigned char data;

	if(argc != 2){
		printf("Error Usage!\r\n");
		return -1;
	}

	filename = argv[1];

	/* 打开key驱动 */
	fd = open(filename, O_RDWR | O_NONBLOCK);
	if(fd < 0)
	{
		printf("file %s open failed!\r\n", argv[1]);
		return -1;
	}

#if 1
	/* 构造结构体 */
	fds.fd = fd;
	fds.events = POLLIN;

	while(1)
	{
		ret = poll(&fds, 1, 500);
		if (ret) 
		{
			/* 数据有效 */
			ret = read(fd, &data, sizeof(data));
			if (ret < 0)
			{
				// printf("data unvalid.\r\n");
			}
			else if (data) 
			{	
				printf("key value = %#X\r\n", data);
			}
		}
		else if (ret == 0) 
		{	
			/* 用户自定义超时处理 */
		}
		else if (ret < 0)
		{
			/* 用户自定义错误处理 */
		}
	}
#else
	while(1)
	{
		FD_ZERO(&readfds);
		FD_SET(fd, &readfds);

		/* 构造超时时间 */
		timeout.tv_sec = 0;
		timeout.tv_usec = 500000; /* 500ms */
		ret = select(fd + 1, &readfds, NULL, NULL, &timeout);
		if (ret) 
		{
			if(FD_ISSET(fd, &readfds))
			{
				/* 数据有效 */
				ret = read(fd, &data, sizeof(data));
				if (ret < 0)
				{
					// printf("data unvalid.\r\n");
				}
				else if (data) 
				{	
					printf("key value = %#X\r\n", data);
				}
			}
		}
		else if (ret == 0) 
		{	
			/* 用户自定义超时处理 */
		}
		else if (ret < 0)
		{
			/* 用户自定义错误处理 */
		}
	}
#endif

	ret= close(fd); /* 关闭文件 */
	if(ret < 0)
	{
		printf("file %s close failed!\r\n", argv[1]);
		return -1;
	}
	return 0;
}
